// 创建用户的小仓库
import { defineStore } from 'pinia'
// 引入接口 reqLogout
import { reqLogin } from '@/api/user'
// 引入数据类型
import type { loginFormData } from '@/api/user/type'
import type { UserState } from '../types/type'
//引入操作本地存储的工具方法
import { SET_TOKEN, GET_TOKEN, REMOVE_TOKEN } from '@/utils/token'
import { GET_ITEM, SET_ITEM } from '@/utils/local'
//引入路由(常量路由)
import { constantRoute } from '@/router/routers.ts'
// 不需要导入未使用的类型和工具函数
const useUserStore = defineStore('User', {
     state: (): UserState => {
          return {
               token: GET_TOKEN() as string | null, //用户唯一标识token
               menuRoutes: [], //仓库存储生成菜单需要数组(路由)
               username: GET_ITEM('userInfoData')?.username ?? '',
               avatar: '',
               //存储当前用户是否包含某一个按钮
               buttons: [],
               verifyCodes: '',
               userInfoData: {} as Record<string, any>,
               heartbeatInterval: null as NodeJS.Timeout | null,
          }
     },
     actions: {
          // 获取验证码信息
          async getVerifyCode() {
               // 发送请求获取验证码
               // const result: any = await GetVerifyCodes()
               // if (result) {
               //      this.verifyCodes = result
               // } else {
               //      return Promise.reject(new Error(result))
               // }
               // 随机生成四位验证码 数字类型
               // this.verifyCodes = Math.random().toString(36).substr(2, 4)

               // 随机生成四位验证码 一到九
               this.verifyCodes = Math.floor(
                    Math.random() * 9000 + 1000,
               ).toString()
          },
          // 登录请求
          async userLogin(data: loginFormData) {
               // 定义登录API返回的数据格式
               // await Refresh()
               try {
                    // reqLogin返回AxiosResponse，我们需要获取其data属性
                    const result: any = await reqLogin(data)
                    if (result && result[0]) {
                         this.token = result[0].TokenValue
                         // 本地持久化存储token
                         // SET_TOKEN(
                         //      ('bearer ' + result[0].access_token) as string,
                         // )
                         SET_TOKEN(result[0].TokenValue)
                         this.userInfoData = result[0]
                         this.username = result[0].chname
                         this.menuRoutes = constantRoute
                         SET_ITEM('userInfoData', result)
                    }
                    return 'ok'
               } catch (err) {
                    console.log(err)
                    return Promise.reject(err)
               } finally {
                    this.menuRoutes = constantRoute
               }
          },

          //获取用户信息方法
          async userInfo() {
               // //获取用户信息进行存储仓库当中[用户头像、名字]
               // let result: userInfoReponseData = await reqUserInfo()
               // //如果获取用户信息成功，存储一下用户信息
               // if (result.code == 200) {
               //      this.username = result.data.checkUser.username
               //      this.avatar = result.data.checkUser.avatar
               //      this.buttons = result.data.checkUser.buttons
               //      //计算当前用户需要展示的异步路由
               //      let userAsyncRoute = filterAsyncRoute(
               //           cloneDeep(asnycRoute),
               //           result.data.checkUser.routes,
               //      )
               //      //菜单需要的数据整理完毕
               //      this.menuRoutes = [
               //           ...constantRoute,
               //           ...userAsyncRoute,
               //           anyRoute,
               //      ]
               //      //目前路由器管理的只有常量路由:用户计算完毕异步路由、任意路由动态追加
               //      ;[...userAsyncRoute, anyRoute].forEach((route: any) => {
               //           router.addRoute(route)
               //      })
               //      return 'ok'
               // } else {
               //      return Promise.reject(new Error('获取信息失败'))
               // }
          },
          //退出登录
          async userLogout() {
               //退出登录请求
               // let result: any = await reqLogout()
               // if (result.code == 200) {
               //   //目前没有mock接口:退出登录接口(通知服务器本地用户唯一标识失效)
               //   this.token = ''
               //   this.username = ''
               //   this.avatar = ''
               //   REMOVE_TOKEN()
               //   return 'ok'
               // } else {
               //   return Promise.reject(new Error(result.message))
               // }
               this.userInfoData = {}
               this.token = ''
               this.username = ''
               this.avatar = ''
               this.menuRoutes = []
               REMOVE_TOKEN()
               localStorage.clear()
          },
     },
     getters: {},
     // 使用pinia-plugin-persistedstate插件的正确配置格式
     // 开启 pinia 状态持久化功能
     persist: {
          // 启用持久化
          enabled: true,
          // 配置持久化策略
          strategies: [
               {
                    // 使用 sessionStorage 存储持久化数据
                    storage: window.sessionStorage,
               },
          ],
     } as any,
})
export default useUserStore
